﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DiveManager
{
    public partial class Warenkorb : Form
    {

        protected DiveDatabaseEntities diveDatabase;
        protected BindingSource bindingSource;
        
        public string todo;
        public Guid artikel_guid;
        Guid WarenkorbID = System.Guid.NewGuid();

        string bezeichnung;
        int artikelnr;
        string beschreibung;
        double sollpreis_normal;
        double sollpreis_club;
        public int kdnr=0;
        public int mwst_satz;
        public string person;
        public string warteschleifenaktion;
        public int warteschleifenkdnr;
        public string warteschleifenvorgang;

        public string rw_bezeichnung;
        public string rw_beschreibung;
        public int rw_menge;
        public double rw_preis;
        public double rw_gesamtpreis;
        public Guid rw_id;

        public Guid ws_guid;

        public string artikelID;

        public int use_artikelnummer;

        public DateTime date;

        public double artikel_netto;
        public double zws1;
        public double differenz;
        public double gesamt_netto;
        
        public Warenkorb()
        {
            InitializeComponent();

            // Init Database
            diveDatabase = new DiveDatabaseEntities();
            bindingSource = new BindingSource();
        }

        private void Warenkorb_Load(object sender, EventArgs e)
        {
            LoadInhalt();

            txWeitergabeArtikelNr.DataBindings.Add(new Binding("Text", bindingSource, "ID"));

            date = System.DateTime.Now;
        }

        private void btChooseKunde_Click(object sender, EventArgs e)
        {
            //Öffnen der Einfachen Kundensuche
            //Rückgabe der Kundennummer aus der Suche
            //Anhand der Kundennummer Kundendaten aus DB abfragen
            //Kundennummer in kdnr speichern

            KundensucheEinfach kundensucheeinfach = new KundensucheEinfach();
            kundensucheeinfach.ShowDialog();

            kdnr = kundensucheeinfach.kdnr;
            txShowKDNR.Text = kdnr.ToString();

            Kundendaten();

            
        }

        private void btSearchArtikel_Click(object sender, EventArgs e)
        {
            //Öffnen der Einfachen Artikelsuche
            //Rückgabe der Artikelnummer
            //Anhand der Artikelnummer werden die Artikeldaten dem Warenkorb hinzugefügt

            ArtikelsucheEinfach artsuein = new ArtikelsucheEinfach();
            artsuein.ShowDialog();

            artikel_guid = artsuein.artikel;

            //Auslesen der Artikeldaten anhand der Artikelguid
            //Abfrage in Product_Main
            var query_main = from sm in diveDatabase.Product_Main
                             where sm.ID == artikel_guid
                             select sm;

            foreach (var pm in query_main)
            {
                use_artikelnummer = pm.Artikel_Nr;
            }

            addArtikel();

        }

        private void btOK_Click(object sender, EventArgs e)
        {
            //Öffnen des Dialogfensters, was mit dem Warenkorb geschehen soll
            //Rückgabe des Ereignisses
            //Anschließend entsprechende speicherung der Daten

            todo = "";
            
            //Öffnen von Warenkorb abschließen
            WarenkorbAbschluss wkab = new WarenkorbAbschluss();
            wkab.ShowDialog();

            todo = wkab.aktion;

            if (todo.Equals("Rechnung"))
            {
                //Aus dem Warenkorb wird eine Rechnung erstellt

                //In die Tabelle Warenkorb schreiben
                Warenkorb_Main warenkorbmain = new Warenkorb_Main();
                warenkorbmain.ID = WarenkorbID;
                warenkorbmain.KDNR = kdnr;
                //-->Einfügen von DateTime vervollständigen
                warenkorbmain.Date = date;
                //-->Einfügen des Users vervollständigen
                warenkorbmain.User = 0;
                warenkorbmain.Abschluss = "Rechnung";
                // Add to DB
                diveDatabase.AddToWarenkorb_Main(warenkorbmain);
                diveDatabase.SaveChanges();

                //Öffnen des Rechnungs erstellen Fensters
                //Übertragen der Daten in die Rechnung
                
            }
            if (todo.Equals("Angebot"))
            {
                //Aus dem Warenkorb wird ein Angebot erstellt

                //In die Tabelle Warenkorb schreiben
                Warenkorb_Main warenkorbmain = new Warenkorb_Main();
                warenkorbmain.ID = WarenkorbID;
                warenkorbmain.KDNR = kdnr;
                //-->Einfügen von DateTime vervollständigen
                warenkorbmain.Date = date;
                //-->Einfügen des Users vervollständigen
                warenkorbmain.User = 0;
                warenkorbmain.Abschluss = "Angebot";
                // Add to DB
                diveDatabase.AddToWarenkorb_Main(warenkorbmain);
                diveDatabase.SaveChanges();

                //Öffnen des Angebot erstellen Fensters
                //Übertragen der Daten in das Angebot
                
            }
            if (todo.Equals("Auftrag"))
            {
                //Erstellen eines Auftrags

                //In die Tabelle Warenkorb schreiben
                Warenkorb_Main warenkorbmain = new Warenkorb_Main();
                warenkorbmain.ID = WarenkorbID;
                warenkorbmain.KDNR = kdnr;
                //-->Einfügen von DateTime vervollständigen
                warenkorbmain.Date = date;
                //-->Einfügen des Users vervollständigen
                warenkorbmain.User = 0;
                warenkorbmain.Abschluss = "Auftrag";
                // Add to DB
                diveDatabase.AddToWarenkorb_Main(warenkorbmain);
                diveDatabase.SaveChanges();

                //Öffnen des Auftrag erstellen Fensters
                //Übertragen der Daten in den Auftrag
       
            }
        }

        private void btVorgang_Click(object sender, EventArgs e)
        {
            //Öffnen der Übersicht über Vorgänge in der Warteschleife
            //Rückgabe der Vorgangsnummer
            //Anhand der Vorgangsnummer werden doe Vorgangsdaten dem Warenkorb hinzugefügt

            RechnungsWarteschliefe rewa = new RechnungsWarteschliefe();
            rewa.Weitergabe_Kunde = kdnr.ToString();
            rewa.ShowDialog();

            warteschleifenaktion = rewa.aktion;

            if (warteschleifenaktion.Equals("einzel"))
            {
                
                //Nur die einzelne Position wird abgerechnet
                //über Vorgangsnummer
                warteschleifenvorgang=rewa.vorgangsnr;
                ws_guid = new Guid(warteschleifenvorgang);

                //Abfrage in Product_Description
                var RechnungsWarteschleife = from rw in diveDatabase.RechnungWarteschleife
                                        where rw.ID == ws_guid
                                        select rw;

                foreach (var rw in RechnungsWarteschleife)
                {
                    rw_bezeichnung = rw.Bezeichnung;
                    rw_beschreibung = rw.Beschreibung;
                    rw_menge = rw.Menge;
                    rw_preis = rw.Preis;
                    rw_gesamtpreis = rw.Gesamtpreis;
                }

                //In die Tabelle WarenkorbDetails schreiben
                WarenkorbDetails warenkorbdetails = new WarenkorbDetails();
                warenkorbdetails.ID = System.Guid.NewGuid();
                warenkorbdetails.Warenkorb_ID = WarenkorbID;
                warenkorbdetails.Artikel_Nr = 0;
                warenkorbdetails.Bezeichnung = rw_bezeichnung;
                warenkorbdetails.Beschreibung = rw_beschreibung;

                //Hier muss beim Einfügen des Kunden noch ein Flag für Club
                //oder nicht gesetzt werden. Danach entscheidet sich der Preis
                warenkorbdetails.Soll_Preis = rw_preis;
                warenkorbdetails.Ist_Preis = rw_preis;
                warenkorbdetails.Menge = rw_menge;
                warenkorbdetails.Gesamtpreis = rw_gesamtpreis;
                //warenkorbdetails.Soll_Preis = sollpreis_club;
                //wenn Club Rabatt automatisch setzen
                warenkorbdetails.Rabatt_prozent = 0;

                double rw_zws = rw_preis / 100 * 19;
                double rw_artikel_netto = rw_preis - rw_zws;
                double rw_differenz = rw_preis-rw_artikel_netto;
                double rw_gesamt_netto = rw_artikel_netto * rw_menge;

                warenkorbdetails.MWST = 19;
                warenkorbdetails.Gesamtpreis_Netto = rw_gesamt_netto;
                warenkorbdetails.Artikel_Netto = rw_artikel_netto;
                warenkorbdetails.Differenz = rw_differenz;
                // Add to DB
                diveDatabase.AddToWarenkorbDetails(warenkorbdetails);
                diveDatabase.SaveChanges();

                //In die Tabelle Warteschleife_Warenkorb schreiben
                Warteschleife_Warenkorb wartekorb = new Warteschleife_Warenkorb();
                wartekorb.ID = System.Guid.NewGuid();
                wartekorb.Warenkorb_ID = WarenkorbID;
                wartekorb.Vorgangs_ID = new Guid(warteschleifenvorgang);
                // Add to DB
                diveDatabase.AddToWarteschleife_Warenkorb(wartekorb);
                diveDatabase.SaveChanges();

                LoadInhalt();
                Gesamtsumme();
            }
            if (warteschleifenaktion.Equals("alle"))
            {
                //Alle Positionen werden abgerechnet
                //Über kdnr
                warteschleifenkdnr = rewa.kdnr;

                //Abfrage in Product_Description
                var RechnungsWarteschleife = from rw in diveDatabase.RechnungWarteschleife
                                             where rw.KDNR == warteschleifenkdnr
                                             select rw;

                foreach (var rw in RechnungsWarteschleife)
                {
                    rw_bezeichnung = rw.Bezeichnung;
                    rw_beschreibung = rw.Beschreibung;
                    rw_menge = rw.Menge;
                    rw_preis = rw.Preis;
                    rw_gesamtpreis = rw.Gesamtpreis;
                    rw_id = rw.ID;

                    //In die Tabelle WarenkorbDetails schreiben
                    WarenkorbDetails warenkorbdetails = new WarenkorbDetails();
                    warenkorbdetails.ID = System.Guid.NewGuid();
                    warenkorbdetails.Warenkorb_ID = WarenkorbID;
                    warenkorbdetails.Artikel_Nr = 0;
                    warenkorbdetails.Bezeichnung = rw_bezeichnung;
                    warenkorbdetails.Beschreibung = rw_beschreibung;

                    //Hier muss beim Einfügen des Kunden noch ein Flag für Club
                    //oder nicht gesetzt werden. Danach entscheidet sich der Preis
                    warenkorbdetails.Soll_Preis = rw_preis;
                    warenkorbdetails.Ist_Preis = rw_preis;
                    warenkorbdetails.Menge = rw_menge;
                    warenkorbdetails.Gesamtpreis = rw_gesamtpreis;
                    //warenkorbdetails.Soll_Preis = sollpreis_club;
                    //wenn Club Rabatt automatisch setzen
                    warenkorbdetails.Rabatt_prozent = 0;

                    double rw_zws = rw_preis / 100 * 19;
                    double rw_artikel_netto = rw_preis - rw_zws;
                    double rw_differenz = rw_preis - rw_artikel_netto;
                    double rw_gesamt_netto = rw_artikel_netto * rw_menge;

                    warenkorbdetails.MWST = 19;
                    warenkorbdetails.Gesamtpreis_Netto = rw_gesamt_netto;
                    warenkorbdetails.Artikel_Netto = rw_artikel_netto;
                    warenkorbdetails.Differenz = rw_differenz;
                    // Add to DB
                    diveDatabase.AddToWarenkorbDetails(warenkorbdetails);

                    //In die Tabelle Warteschleife_Warenkorb schreiben
                    Warteschleife_Warenkorb wartekorb = new Warteschleife_Warenkorb();
                    wartekorb.ID = System.Guid.NewGuid();
                    wartekorb.Warenkorb_ID = WarenkorbID;
                    wartekorb.Vorgangs_ID = rw_id;
                    // Add to DB
                    diveDatabase.AddToWarteschleife_Warenkorb(wartekorb);
                    
                }
                diveDatabase.SaveChanges();
                LoadInhalt();
                Gesamtsumme();
            }

        }

        protected void LoadInhalt()
        {
            IQueryable<WarenkorbDetails> dataQuery = (from a in diveDatabase.WarenkorbDetails
                                                      where a.Warenkorb_ID == WarenkorbID
                                                   select a);

            // Bind Data to BindingSource
            bindingSource.DataSource = dataQuery;

            // Bind BindingSource to List
            WarenkorbListe.DataSource = bindingSource;


            // Hide ID-Columns
            WarenkorbListe.Columns["ID"].Visible = false;
            WarenkorbListe.Columns["Warenkorb_ID"].Visible = false;
            WarenkorbListe.Columns["Artikel_Nr"].Visible = true;
            WarenkorbListe.Columns["Bezeichnung"].Visible = true;
            WarenkorbListe.Columns["Beschreibung"].Visible = false;
            WarenkorbListe.Columns["Rabatt_prozent"].Visible = false;
            WarenkorbListe.Columns["Menge"].Visible = true;
            WarenkorbListe.Columns["Soll_Preis"].Visible = false;
            WarenkorbListe.Columns["Ist_Preis"].Visible = true;
            WarenkorbListe.Columns["Gesamtpreis"].Visible = true;
            WarenkorbListe.Columns["MWST"].Visible = true;
            WarenkorbListe.Columns["Gesamtpreis_Netto"].Visible = true;
            WarenkorbListe.Columns["Artikel_Netto"].Visible = true;
            WarenkorbListe.Columns["Differenz"].Visible = true;


            // Set Column Headers
            WarenkorbListe.Columns["Artikel_Nr"].HeaderText = "Art. Nr.";
            WarenkorbListe.Columns["Ist_Preis"].HeaderText = "Einzelpreis";
            WarenkorbListe.Columns["Gesamtpreis"].HeaderText = "Gesamt";


        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            //In der Liste ausgewählten Artikel Bearbeiten
            //Artikelnummer übergeben,
            this.txWeitergabeArtikelNr.Visible = true;
            artikelID = txWeitergabeArtikelNr.Text;
            //this.txWeitergabeArtikelNr.Visible = false;
            ArtikelBearbeitenWarenkorb arbewa = new ArtikelBearbeitenWarenkorb();
            arbewa.Weitergabe_Artikel = artikelID;
            arbewa.ShowDialog();

            if (arbewa.changes == true)
            {
                LoadInhalt();
                Gesamtsumme();

                //Funtioneirt nicht

            }

        }

        private void btDetails_Click(object sender, EventArgs e)
        {
            
        }

        private void btDelete_Click(object sender, EventArgs e)
        {
            /*Guid deleteID=new Guid (txWeitergabeArtikelNr.Text);
            
            //Den in der Liste ausgewählten Artikel löschen
            var deleteArtikel = (from a in diveDatabase.WarenkorbDetails
                                 where a.ID == deleteID
                                 select a);

            foreach (var detail in deleteArtikel)
            {
                diveDatabase.WarenkorbDetails.DeleteObject(detail);
                diveDatabase.SaveChanges();
            }

            LoadInhalt();
            Gesamtsumme();*/
        }

        private void button1_Click(object sender, EventArgs e)
        {
            LoadInhalt();
        }

        private void Gesamtsumme()
        {
            System.Nullable<Double> gesamtsumme =
            (from a in diveDatabase.WarenkorbDetails
             where a.Warenkorb_ID == WarenkorbID
            select a.Gesamtpreis)
            .Sum();

            System.Nullable<Double> gesamtnetto =
            (from a in diveDatabase.WarenkorbDetails
             where a.Warenkorb_ID == WarenkorbID
             select a.Gesamtpreis_Netto)
            .Sum();

            System.Nullable<Double> gesamtmwst =
            (from a in diveDatabase.WarenkorbDetails
             where a.Warenkorb_ID == WarenkorbID
             select a.Differenz)
            .Sum();

            txShowGesamt.Text = gesamtsumme.ToString();
            txShowNetto.Text = gesamtnetto.ToString();
            txShowMWST.Text = gesamtmwst.ToString();
        }

        private void ArtikelNetto()
        {
            zws1 = sollpreis_normal / 100 * mwst_satz;
            artikel_netto = sollpreis_normal - zws1;
            differenz = sollpreis_normal - artikel_netto;
            gesamt_netto = artikel_netto * 1;
        }

        private void Kundendaten()
        {
            var Customer_MainPerson = from cm in diveDatabase.Customer_Main
                                      where cm.KDNR == kdnr
                                      select cm;

            foreach (var cm in Customer_MainPerson)
            {
                person = cm.Person;
            }

            if (person.Equals("einzelperson"))
            {
                //Elemente für die Firma ausblenden
                label2.Text = "Name";
                txShowNachname.Visible = true;
                txShowVorname.Visible = true;
                txShowFirma.Visible = false;

                //Auslesen der Daten aus Customer Main
                var Customer_Main = from cm in diveDatabase.Customer_Main
                                    where cm.KDNR == kdnr
                                    select cm;

                foreach (var cm in Customer_Main)
                {
                    txShowVorname.Text = cm.Vorname;
                    txShowNachname.Text = cm.Name;
                }
            }

            if (person.Equals("firma"))
            {

                //Elemente für die Einzelperson ausblenden
                label2.Text = "Firma";
                txShowNachname.Visible = false;
                txShowVorname.Visible = false;
                txShowFirma.Visible = true;

                //Auslesen der Daten aus Customer Main
                var Customer_Main = from cm in diveDatabase.Customer_Main
                                    where cm.KDNR == kdnr
                                    select cm;

                foreach (var cm in Customer_Main)
                {
                    txShowFirma.Text = cm.Firma;
                }
            }
        }

        private void btKundenKarte_Click(object sender, EventArgs e)
        {
            KundenkarteSuche kundenskarte = new KundenkarteSuche();
            kundenskarte.ShowDialog();

            kdnr = kundenskarte.kdnr;
            txShowKDNR.Text = kdnr.ToString();

            Kundendaten();
        }

        private void btFreierArtikel_Click(object sender, EventArgs e)
        {
            //Freien Artikel hinzufügen

            //In die Tabelle WarenkorbDetails schreiben
            WarenkorbDetails warenkorbdetails = new WarenkorbDetails();
            warenkorbdetails.ID = System.Guid.NewGuid();
            warenkorbdetails.Warenkorb_ID = WarenkorbID;
            warenkorbdetails.Artikel_Nr = 9999;
            warenkorbdetails.Bezeichnung = "Freier Artikel";
            warenkorbdetails.Beschreibung = "--bitte einfügen--";

            //Hier muss beim Einfügen des Kunden noch ein Flag für Club
            //oder nicht gesetzt werden. Danach entscheidet sich der Preis
            warenkorbdetails.Soll_Preis = 0;
            warenkorbdetails.Ist_Preis = 0;
            warenkorbdetails.Menge = 1;
            warenkorbdetails.Gesamtpreis = 0;
            //warenkorbdetails.Soll_Preis = sollpreis_club;
            //wenn Club Rabatt automatisch setzen
            warenkorbdetails.Rabatt_prozent = 0;
            // Add to DB
            diveDatabase.AddToWarenkorbDetails(warenkorbdetails);
            diveDatabase.SaveChanges();

            LoadInhalt();
            Gesamtsumme();
        }

        private void btScannen_Click(object sender, EventArgs e)
        {
            //Form zum Scansimulator öffnen
            Scannen();
        }

        public void addArtikel()
        {
            //Auslesen der Artikeldaten anhand der Artikelguid
            //Abfrage in Product_Main
            var query_main = from sm in diveDatabase.Product_Main
                             where sm.Artikel_Nr == use_artikelnummer
                             select sm;

            foreach (var pm in query_main)
            {
                artikelnr = pm.Artikel_Nr;
                bezeichnung = pm.Name;
            }

            //Abfrage in Product_Description
            var query_description = from pd in diveDatabase.Product_Description
                                    where pd.ID == artikel_guid
                                    select pd;

            foreach (var pd in query_description)
            {
                beschreibung = pd.Description;
            }

            //Abfrage in Product_SaleSettings
            var query_salesettings = from pss in diveDatabase.Product_SaleSettings
                                     where pss.ID == artikel_guid
                                     select pss;

            foreach (var pss in query_salesettings)
            {
                sollpreis_normal = Convert.ToDouble(pss.VK_Preis);
                sollpreis_club = Convert.ToDouble(pss.VK_Club);
                mwst_satz = Convert.ToInt32(pss.MWST);
            }

            ArtikelNetto();


            //In die Tabelle WarenkorbDetails schreiben
            WarenkorbDetails warenkorbdetails = new WarenkorbDetails();
            warenkorbdetails.ID = System.Guid.NewGuid();
            warenkorbdetails.Warenkorb_ID = WarenkorbID;
            warenkorbdetails.Artikel_Nr = artikelnr;
            warenkorbdetails.Bezeichnung = bezeichnung;
            warenkorbdetails.Beschreibung = beschreibung;

            //Hier muss beim Einfügen des Kunden noch ein Flag für Club
            //oder nicht gesetzt werden. Danach entscheidet sich der Preis
            warenkorbdetails.Soll_Preis = sollpreis_normal;
            warenkorbdetails.Ist_Preis = sollpreis_normal;
            warenkorbdetails.Menge = 1;
            warenkorbdetails.Gesamtpreis = sollpreis_normal;
            //warenkorbdetails.Soll_Preis = sollpreis_club;
            //wenn Club Rabatt automatisch setzen
            warenkorbdetails.Rabatt_prozent = 0;
            warenkorbdetails.MWST = mwst_satz;
            warenkorbdetails.Gesamtpreis_Netto = gesamt_netto;
            warenkorbdetails.Artikel_Netto = artikel_netto;
            warenkorbdetails.Differenz = differenz;
            // Add to DB
            diveDatabase.AddToWarenkorbDetails(warenkorbdetails);
            diveDatabase.SaveChanges();

            LoadInhalt();
            Gesamtsumme();
        }

        private void Scannen()
        {
            //Was passiert beim Scannen eines Artikels
            ScannsimulatorArtikel scanner = new ScannsimulatorArtikel();
            scanner.ShowDialog();

            use_artikelnummer = scanner.artikelnr;

            addArtikel();
        }
    }
}
